package com.huiyi.quickproj.jundui;

import java.io.*;

/**
 * describe:
 *
 * @author: robin
 * @date //
 */
public class TextFileChecker {

    // 太慢
//    public static boolean isTextFile(File file) {
//        boolean isText = true;
//
//        try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
//            int character;
//            while ((character = reader.read()) != -1) {
//                // 检查字符的范围，如果包含非文本字符，将文件标记为非文本文件
//                if (character < 0x20 && character != 0x09 && character != 0x0A && character != 0x0D) {
//                    isText = false;
//                    break;
//                }
//            }
//        } catch (IOException e) {
//            // 处理异常
//            e.printStackTrace();
//            isText = false;
//        }
//
//        return isText;
//    }

    private static final int MAX_MAGIC_BYTES = 4096; // 读取的最大字节数

    public static boolean isTextFile(File file) {
        try (InputStream is = new FileInputStream(file)) {
            byte[] buffer = new byte[MAX_MAGIC_BYTES];
            int bytesRead = is.read(buffer);

            // 检查文件的字节开头，判断是否为文本文件
            return isTextFile(buffer, bytesRead);
        } catch (IOException e) {
            // 处理异常
            e.printStackTrace();
            return false;
        }
    }

    private static boolean isTextFile(byte[] buffer, int bytesRead) {
        if (bytesRead >= 2 && buffer[0] == (byte) 0xFF && buffer[1] == (byte) 0xFE) {
            // UTF-16 LE
            return false;
        } else if (bytesRead >= 2 && buffer[0] == (byte) 0xFE && buffer[1] == (byte) 0xFF) {
            // UTF-16 BE
            return false;
        } else if (bytesRead >= 3 && buffer[0] == (byte) 0xEF && buffer[1] == (byte) 0xBB && buffer[2] == (byte) 0xBF) {
            // UTF-8
            return false;
        } else {
            // 判断为文本文件的简单逻辑
            for (int i = 0; i < bytesRead - 1; i++) {
                if (buffer[i] == 0 && buffer[i + 1] < 0x08) {
                    return false;
                }
            }
            return true;
        }
    }


}
